/* Copyright ©北京微利宝信息技术有限公司 right reserved.*/

package com.wlb365.doc.cfca;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;

/**
 * <p>
 * 概述： 签名,有问题请咨询研发团队，注释不作跟进，望理解
 * </p>
 *
 * @author 创建人：   ryl
 * @copyRight 所有权©：  北京微利宝信息技术有限公司  All right reserved.
 * @date 创建时间： 2018年7月27日 下午4:17:46
 */
public class SignUtils {
    /**
     * 加签实例
     **/
    public Sign sign;
    /**
     * 核签实例
     **/
    public Sign verify;

    /**
     * 证书构建
     *
     * @param privateCertFilePath
     * @param publicCertFilePath
     * @param password
     */
    @SuppressWarnings("static-access")
    public SignUtils(String privateCertFilePath, String publicCertFilePath, String password) {
        String privateKey = KeyUtils.getPrivateKey(privateCertFilePath, password);
        String publicKey = KeyUtils.getPublicKey(publicCertFilePath);
        publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvLA9p6eFJTjNVB+gBC9cRbGjFmjBsgHAc/BP1QRnFgqch5pMjK7+1kxpLLdLklXAmDJKc70z5hfVJ9olTn+GmAYPt+PrjiEVPst7d5q6yjvi6sXQW0e5dj4ylUKap7kMgblqcqmASSVcj+oHWr132xN1EKlT0uugVZNf1Tb3MMdNP5/P1j3RrEMSrFNtScHLe+q27KgM/hJOJHaM8xyy+PWn77OSVXiahHowWiD+OlZuX1FAHP9BmzihOzePv6piwiMnx0bu3fr+QDrnfpywlO9A/hMpiDhyWoAgc0WoKBw6HcN7GUw253TAlmNUTf7aEurjPlBB9+4SyYmSvl6dOQIDAQAB";
        sign = SecureUtil.sign(SignAlgorithm.SHA1withRSA, privateKey, null);
        verify = SecureUtil.sign(SignAlgorithm.SHA1withRSA, null, publicKey);
    }

    /**
     * 公私钥构建
     *
     * @param privateKey
     * @param publicKey
     */
    public SignUtils(String privateKey, String publicKey) {
        sign = SecureUtil.sign(SignAlgorithm.SHA1withRSA, privateKey, null);
        verify = SecureUtil.sign(SignAlgorithm.SHA1withRSA, null, publicKey);
    }

    /**
     * <p>
     * 概述： 签名
     * </p>
     *
     * @param data 需签名数据
     * @return String 签名后的数据
     * @author ryl
     * @date 2018年7月27日 下午4:29:56
     */
    public String sign(String data) {
        try {
            return Base64Util.encodeByte(sign.sign(data.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * <p>
     * 概述： 验签
     * </p>
     *
     * @param data   数据
     * @param signed 签名
     * @return boolean false 验签失败
     * @author ryl
     * @date 2018年7月27日 下午4:29:10
     */
    public boolean verify(String data, String signed) {
        try {
            return verify.verify(data.getBytes(), Base64Util.decodeString(signed));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * <p>
     * 概述： 签名核签测试用例
     * </p>
     *
     * @return 返回：          void
     * @author 创建人：      ryl
     * @date 创建时间：   2018年8月21日 下午2:36:16
     */
    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        String privatePath = "/wlb/ht/pfx/";
        String publicPath = "/wlb/ht/cer/";
        String pfx = "JFJT.pfx";
        String cer = "JFJT.cer";
        String password = "111111";
        SignUtils signUtils = new SignUtils(privatePath + pfx, publicPath + cer, password);
        String sign = "12345678";
        String signed = signUtils.sign(sign);
        System.out.println("签名==>：" + signed);
        System.out.println("验签==>:" + signUtils.verify(sign, signed));
    }
}
